/*
题目: 编辑距离
给你两个单词 word1 和 word2， 请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作：

    插入一个字符
    删除一个字符
    替换一个字符

https://leetcode.cn/problems/edit-distance
 */
public class MinDistance {
    int m, n;
    public int minDistance(String word1, String word2) {
        m = word1.length();
        n = word2.length();
        // dp[i][j] 表示 word1[:i] 和 word2[:j] 的最小编辑距离, 不包括边界
        int[][] dp = new int[m + 1][n + 1];
        init(dp, word1, word2);

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    // 分为替换, word1删除, word2删除
                    dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;
                }
            }
        }

        return dp[m][n];
    }

    private void init(int[][] dp, String word1, String word2) {
        for (int i = 0; i <= m; i++) {
            dp[i][0] = i;
        }
        for (int i = 0; i <= n; i++) {
            dp[0][i] = i;
        }
    }
}
